friend for overloading

#include <iostream>
#include <string>
using namespace std;;
class complex{
private:
int i;
int j;
public:
complex(): i(0), j(0) {}
complex(int _i, int _j):i(_i), j(_j) {}
void print(){
if(j==0)cout<<i<<endl;
else if(i==0)cout<<j<<endl;
else if(j<0)cout<<i<<'-'<<-j<<'j'<<endl;
else if(j>0)cout<<i<<'+'<<j<<'j'<<endl;
}
const complex operator+(const complex& CX)const{
complex temp;
temp.i=this->j+CX.i;
temp.j=this->j+CX.j;
return temp;
}
};
위와 같이 정의된 complex 클래스는  complex+complex 형식에서는 연산이 가능하다.
하지만 complex+int형은 사용이 불가능하다.
#include <iostream>
#include <string>
using namespace std;
class complex{
private:
int i;
int j;
public:
complex(): i(0), j(0) {}
complex(int _i, int _j):i(_i), j(_j) {}
void print(){
if(j==0)cout<<i<<endl;
else if(i==0)cout<<j<<endl;
else if(j<0)cout<<i<<'-'<<-j<<'j'<<endl;
else if(j>0)cout<<i<<'+'<<j<<'j'<<endl;
}
const complex operator+(const complex& CX)const{
complex temp;
temp.i=this->j+CX.i;
temp.j=this->j+CX.j;
return temp;
}
const complex operator+(const int x)const{ //
complex temp;
temp.i=this->i+x;
temp.j=this->j;
return temp;
}
};
int main(){
complex C(-3, -5);
complex R=C+3;
R.print();
}
complex+int 형을 사용할 수 있게 하기 위해서 함수를 추가하였다.
하지만 int+complex형은 여전히 사용 불가능하다.

이를 해결하기 위해서는 int타입 내부의 연산자를 오버로딩 해야하는데 이는 무리가 있다.
이런 경우 연산자 전역 함수를 이용한 연산자 오버로딩을 한다.(friend)
#include <iostream>
#include <string>
using namespace std;;
class complex{
private:
int i;
int j;
public:
complex(): i(0), j(0) {}
complex(int _i, int _j):i(_i), j(_j) {}
void print(){
if(j==0)cout<<i<<endl;
else if(i==0)cout<<j<<endl;
else if(j<0)cout<<i<<'-'<<-j<<'j'<<endl;
else if(j>0)cout<<i<<'+'<<j<<'j'<<endl;
}
const complex operator+(const complex& CX)const{
complex temp;
temp.i=this->j+CX.i;
temp.j=this->j+CX.j;
return temp;
}
const complex operator+(const int x)const{
complex temp;
temp.i=this->i+x;
temp.j=this->j;
return temp;
}
friend const complex operator+(const int X, const complex& CX);
};
const complex operator+(const int X, const complex& CX){ //
complex temp;
temp.i=CX.i+X;
temp.j=CX.j;
return temp;
}
int main(){
complex C(-3, -5);
complex R=3+C;
R.print();
}